package 春招算法加速;

import java.util.Arrays;

public class 排序 {
    //最简单的方法，使用工具类
    public static int[] MySort(int[] arr) {
        if (arr.length < 2) {
            return arr;
        }
        Arrays.sort(arr);
        return arr;
    }

    //使用快速排序
    public static int[] MySort3(int[] arr) {
        //6 1 2 7 9 3 4 5 10 8
        //6 1 2 5 9 3 4 7 10 8
        //6 1 2 5 4 3 9 7 10 8
        //3 1 2 5 4 6 9 7 10 8
        if (arr.length < 2) {
            return arr;
        }
        quickSort(arr, 0, arr.length - 1);
        return arr;
    }

    /**
     * @param arr   数组
     * @param left  左节点
     * @param right 右节点
     */
    public static void quickSort(int[] arr, int left, int right) {
        //只有左节点小于右节点才有意义
        if (left < right) {
            //辅助左指针，初始为0
            int i = left;
            //辅助右指针，初始为arr.length-1
            int j = right;
            //基准数，初始为第一个数
            int middle = arr[i];
            while (i < j) {
                //j往前找，找到第一个比基准数小的数
                //j大于i的前提下，如果大于基准数表示在右边就行了，跳过
                while (i < j && arr[j] >= middle) {
                    j--;
                }
                //此时已经找到比基准数小的数了
                //防止j--后跟i相同。
                if (i < j) {
                    //数据交换，把第一个找到小于6的数填到6的位置上
                    arr[i] = arr[j];
                }
                //i往后找，找到第一个比基准数大的数
                //j大于i的前提下，如果小于基准数表示在左边就行了，跳过
                while (i < j && arr[i] <= middle) {
                    i++;
                }
                //此时已经找到比基准数大的数了
                //防止i++后跟j相同。
                if (i < j) {
                    //数据交换，把第一个找到小于6的数填到原来j的位置上
                    arr[j] = arr[i];
                }
            }
            //i=j时循环退出，说明两边已没有需要交换的数，i=j的下标正是基准数应该呆的地方
            arr[i] = middle;
            //此时i就是中间位置
            //递归查左半部分
            quickSort(arr, left, i - 1);
            //递归查右半部分
            quickSort(arr, i + 1, right);
        }
    }

    //使用冒泡排序(超时)
    public static int[] MySort2(int[] arr) {
        //2 3 1 4 5        2 1 3 4 5      1 2 3 4 5
        if (arr.length < 2) {
            return arr;
        }
        int temp;
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr.length - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
        return arr;
    }

    public static void main(String[] args) {
        int[] a = MySort2(new int[]{5, 2, 3, 1, 4});
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i] + ",");
        }
    }
}
